import configparser
import os
from enum import Enum
from threading import Lock
from typing import Union, Optional

# 全局锁，防止多线程写入冲突
_config_lock = Lock()

class Config(Enum):
    CONFIG_URL = "config.ini"

class CommonConfig(Enum):
    COMMON_CONFIG = "commonConfig"
    '''cpu占比'''
    CPU_USAGE = "cpu_usage"

'''读取配置'''
def read_config(config_url: str = Config.CONFIG_URL.value) -> configparser.ConfigParser:
    """读取配置文件，如果不存在则初始化"""
    if not os.path.exists(config_url):
        init_config(config_url)
    config = configparser.ConfigParser()
    config.read(config_url,encoding='utf-8')
    return config

'''初始化配置'''
def init_config(config_url):
    config = configparser.ConfigParser()
    config[CommonConfig.COMMON_CONFIG.value] = {
        f'{CommonConfig.CPU_USAGE.value}': '95',
    }

    # 写入文件（加锁防止冲突）
    with _config_lock:
        with open(config_url, 'w', encoding='utf-8') as configfile:
            config.write(configfile)

'''读取配置文件-如果不存在则新增'''
def read_config_value(section: str,
    option: str,
    default_value: Optional[Union[str, int, float]] = None,
                      config_url: str = Config.CONFIG_URL.value)  -> str:
    """
        读取配置项，如果不存在则写入默认值

        Args:
            section: 配置段名（如 "orderConfig"）
            option: 配置项名（如 "createOrderAmountLimit"）
            default_value: 默认值（如果是 None，自动转成空字符串）

        Returns:
            配置项的值（字符串）
        """
    config = read_config(config_url)
    write_needed = False
    # 检查并创建 section（如果不存在）
    if not config.has_section(section):
        '''新增一个section'''
        config.add_section(section)
        write_needed = True
    if not config.has_option(section, option):
        if default_value is None:
            default_value = ""  # 避免传入 None 导致报错
        '''设置选项option和值value'''
        config.set(section, option, default_value)
        write_needed = True
    if write_needed:
        with _config_lock:
            with open(config_url, 'w', encoding='utf-8') as configfile:
                config.write(configfile)
    return config.get(section, option)

if __name__ == '__main__':
    print(read_config_value(CommonConfig.COMMON_CONFIG.value, CommonConfig.CPU_USAGE.value))